/**
 * 用户数据管理工具
 * 统一管理用户信息的存储、获取和清理
 */

/**
 * 存储键名常量
 */
export const STORAGE_KEYS = {
	USER_INFO: 'userInfo',
	OPENID: 'openid',
	SESSION_KEY: 'session_key',
	PHONE_NUMBER: 'phoneNumber',
	PHONE_CODE: 'phoneCode',
	LOGIN_CODE: 'loginCode',
	TOKEN: 'token',
	IS_LOGGED_IN: 'isLoggedIn'
}

/**
 * 用户数据管理类
 */
class UserManager {
	constructor() {
		this.storageKeys = STORAGE_KEYS
	}
	
	/**
	 * 保存用户基本信息
	 * @param {Object} userInfo 用户信息对象
	 */
	saveUserInfo(userInfo) {
		try {
			uni.setStorageSync(this.storageKeys.USER_INFO, userInfo)
			console.log('✅ 用户基本信息保存成功:', userInfo)
		} catch (error) {
			console.error('❌ 保存用户基本信息失败:', error)
			throw error
		}
	}
	
	/**
	 * 获取用户基本信息
	 * @returns {Object|null} 用户信息对象
	 */
	getUserInfo() {
		try {
			return uni.getStorageSync(this.storageKeys.USER_INFO)
		} catch (error) {
			console.error('❌ 获取用户基本信息失败:', error)
			return null
		}
	}
	
	/**
	 * 保存微信登录信息
	 * @param {Object} loginData 登录数据
	 */
	saveWechatLoginData(loginData) {
		try {
			const { openid, session_key, unionid } = loginData
			
			if (openid) {
				uni.setStorageSync(this.storageKeys.OPENID, openid)
			}
			if (session_key) {
				uni.setStorageSync(this.storageKeys.SESSION_KEY, session_key)
			}
			if (unionid) {
				uni.setStorageSync('unionid', unionid)
			}
			
			console.log('✅ 微信登录数据保存成功:', { openid, session_key, unionid })
		} catch (error) {
			console.error('❌ 保存微信登录数据失败:', error)
			throw error
		}
	}
	
	/**
	 * 获取微信登录数据
	 * @returns {Object} 登录数据对象
	 */
	getWechatLoginData() {
		try {
			return {
				openid: uni.getStorageSync(this.storageKeys.OPENID),
				session_key: uni.getStorageSync(this.storageKeys.SESSION_KEY),
				unionid: uni.getStorageSync('unionid')
			}
		} catch (error) {
			console.error('❌ 获取微信登录数据失败:', error)
			return {}
		}
	}
	
	/**
	 * 保存手机号信息
	 * @param {Object} phoneData 手机号数据
	 */
	savePhoneData(phoneData) {
		try {
			const { phoneNumber, code } = phoneData
			
			if (phoneNumber) {
				uni.setStorageSync(this.storageKeys.PHONE_NUMBER, phoneNumber)
			}
			if (code) {
				uni.setStorageSync(this.storageKeys.PHONE_CODE, code)
			}
			
			console.log('✅ 手机号数据保存成功:', { phoneNumber, code })
		} catch (error) {
			console.error('❌ 保存手机号数据失败:', error)
			throw error
		}
	}
	
	/**
	 * 获取手机号信息
	 * @returns {Object} 手机号数据对象
	 */
	getPhoneData() {
		try {
			return {
				phoneNumber: uni.getStorageSync(this.storageKeys.PHONE_NUMBER),
				phoneCode: uni.getStorageSync(this.storageKeys.PHONE_CODE)
			}
		} catch (error) {
			console.error('❌ 获取手机号数据失败:', error)
			return {}
		}
	}
	
	/**
	 * 保存登录凭证
	 * @param {string} code 登录凭证
	 */
	saveLoginCode(code) {
		try {
			uni.setStorageSync(this.storageKeys.LOGIN_CODE, code)
			console.log('✅ 登录凭证保存成功:', code)
		} catch (error) {
			console.error('❌ 保存登录凭证失败:', error)
			throw error
		}
	}
	
	/**
	 * 获取登录凭证
	 * @returns {string|null} 登录凭证
	 */
	getLoginCode() {
		try {
			return uni.getStorageSync(this.storageKeys.LOGIN_CODE)
		} catch (error) {
			console.error('❌ 获取登录凭证失败:', error)
			return null
		}
	}
	
	/**
	 * 保存用户token
	 * @param {string} token 用户token
	 */
	saveToken(token) {
		try {
			uni.setStorageSync(this.storageKeys.TOKEN, token)
			console.log('✅ 用户token保存成功')
		} catch (error) {
			console.error('❌ 保存用户token失败:', error)
			throw error
		}
	}
	
	/**
	 * 获取用户token
	 * @returns {string|null} 用户token
	 */
	getToken() {
		try {
			return uni.getStorageSync(this.storageKeys.TOKEN)
		} catch (error) {
			console.error('❌ 获取用户token失败:', error)
			return null
		}
	}
	
	/**
	 * 检查用户是否已登录
	 * @returns {boolean} 是否已登录
	 */
	isLoggedIn() {
		try {
			const userInfo = this.getUserInfo()
			const token = this.getToken()
			const openid = this.getWechatLoginData().openid
			const phoneNumber = this.getPhoneData().phoneNumber
			
			// 如果用户有基本信息，并且有token、openid或手机号，则认为已登录
			return !!(userInfo && (token || openid || phoneNumber))
		} catch (error) {
			console.error('❌ 检查登录状态失败:', error)
			return false
		}
	}
	
	/**
	 * 获取完整的用户数据
	 * @returns {Object} 完整的用户数据
	 */
	getAllUserData() {
		try {
			return {
				userInfo: this.getUserInfo(),
				wechatData: this.getWechatLoginData(),
				phoneData: this.getPhoneData(),
				loginCode: this.getLoginCode(),
				token: this.getToken(),
				isLoggedIn: this.isLoggedIn()
			}
		} catch (error) {
			console.error('❌ 获取完整用户数据失败:', error)
			return {}
		}
	}
	
	/**
	 * 清除所有用户数据
	 */
	clearAllUserData() {
		try {
			Object.values(this.storageKeys).forEach(key => {
				uni.removeStorageSync(key)
			})
			
			// 清除其他相关数据
			uni.removeStorageSync('unionid')
			
			console.log('✅ 所有用户数据清除成功')
		} catch (error) {
			console.error('❌ 清除用户数据失败:', error)
			throw error
		}
	}
	
	/**
	 * 退出登录（清除数据并设置退出标记）
	 */
	logout() {
		try {
			// 设置退出登录标记
			uni.setStorageSync('hasLoggedOut', true)
			
			// 清除所有用户数据
			this.clearAllUserData()
			
			console.log('✅ 退出登录成功')
		} catch (error) {
			console.error('❌ 退出登录失败:', error)
			throw error
		}
	}
	
	/**
	 * 清除指定类型的数据
	 * @param {string} dataType 数据类型
	 */
	clearUserDataByType(dataType) {
		try {
			switch (dataType) {
				case 'userInfo':
					uni.removeStorageSync(this.storageKeys.USER_INFO)
					break
				case 'wechat':
					uni.removeStorageSync(this.storageKeys.OPENID)
					uni.removeStorageSync(this.storageKeys.SESSION_KEY)
					uni.removeStorageSync('unionid')
					break
				case 'phone':
					uni.removeStorageSync(this.storageKeys.PHONE_NUMBER)
					uni.removeStorageSync(this.storageKeys.PHONE_CODE)
					break
				case 'login':
					uni.removeStorageSync(this.storageKeys.LOGIN_CODE)
					uni.removeStorageSync(this.storageKeys.TOKEN)
					break
				default:
					console.warn('⚠️ 未知的数据类型:', dataType)
			}
			
			console.log(`✅ ${dataType} 类型数据清除成功`)
		} catch (error) {
			console.error(`❌ 清除 ${dataType} 类型数据失败:`, error)
			throw error
		}
	}
	
	/**
	 * 导出用户数据（用于调试）
	 * @returns {string} 用户数据JSON字符串
	 */
	exportUserData() {
		try {
			const userData = this.getAllUserData()
			return JSON.stringify(userData, null, 2)
		} catch (error) {
			console.error('❌ 导出用户数据失败:', error)
			return '{}'
		}
	}
}

// 创建单例实例
const userManager = new UserManager()

export default userManager
export { UserManager } 